//用于测试执行将中间区域清理的干净以供新建操作
function testRunResetFormForCreate() {
    testRunCreateOrUpdate = 0;// 标注现在是新建操作
    outSideSteps = [];// 要将储存测试步骤的数组清空
    testRunTabPanel.down('#testRunCommitButton').setHidden(false);
    testRunTabPanel.down('#testRunSaveButton').setHidden(false);
    var item = testRunLeftTree.getSelectionModel().getSelected();// 得到被选择的行的数组.
    testRunHiddenTab(!item.items[0].data.leaf, true);// 如果新建的是文件夹就只是显示详情页就好了
    testRunBanEditor(false);
    testRunDetailForm.down('#testRunDetailFormPriority').setHidden(
        !item.items[0].data.leaf);// 如果是新建文件夹的话就将优先级下拉框隐藏掉
    testRunDetailForm.down('#testRunDetailFormTestDesign').setHidden(
        !item.items[0].data.leaf);// 如果是新建文件夹的话就对应测试计划显示框隐藏掉
    testRunDetailForm.down('#testRunDetailFormTestDesignSelectButton')
        .setHidden(!item.items[0].data.leaf);// 如果是新建文件夹的话就对应测试计划显示框的选择按钮隐藏掉
    testRunDetailForm.down('#testRunDetailFormPriority').setConfig(
        'allowBlank', !item.items[0].data.leaf);// 如果是点击文件夹的话就将优先级下拉框可以不填
    testRunDetailForm.down('#testRunDetailFormState').setHidden(
        !item.items[0].data.leaf);// 如果是点击文件夹的话就将状态显示隐藏掉
    // ********************************基本信息填充begin****************************************//
    testRunDetailForm.down('#testRunDetailFormTitle').setValue();
    testRunDetailForm.down('#testRunDetailFormState').setValue();
    testRunDetailForm.down('#testRunDetailFormAuthor').setValue(currentUser);
    testRunDetailForm.down('#testRunDetailFormPriority').setValue();
    testRunDetailForm.down('#testRunDetailFormDescription').setValue();
    testRunDetailForm.down('#testRunDetailFormCreateDate').setValue();
    testRunDetailForm.down('#testRunDetailFormUpdateDate').setValue();
    testRunDetailForm.down('#testRunDetailFormTestDesign').setValue();
    testRunDetailForm.down('#testRunDetailFormTestDesign').testDesign = '';
    // ********************************基本信息填充end****************************************//
    // ********************************执行记录填充begin****************************************//
    testRunlogStore.removeAll();
    // ********************************测试步骤填充end****************************************//
}

// 将测试执行的TabPanel显示到中心区域
function testRunShowForm() {
    Ext.getCmp('centerRegion').add(testRunTabPanel);// 将编辑测试执行的表单显示到中心区域
}

// 点击测试执行菜单某个节点之后之后的操作
function testRunItemClick(view, record, item, index, e, eOpts) {
    Ext.getCmp('centerRegion').removeAll(false);// 先移除原有的items,不然直接添加会叠加,如果设置为true就是会自动销毁之前的组件，之后就无法在使用这个组件了
    var checkLogTabHidden = true;
    if (record.data.isCreate == 1) {// 如果点击的节点是新建节点的话
        testRunLogStepStore.removeAll();
        testRunlogStore.removeAll();
        testRunCreateOrUpdate = 0;// 标注现在是新建操作
        testRunResetFormForCreate();// 表单改造的可以用于新建操作
        testRunBanEditor(false);// 如果是新建节点就不用禁止操作
    } else {
        testRunCreateOrUpdate = 1;// 标注现在是编辑操作
        outSideSteps = [];// 要将储存测试步骤的数组清空
        var data = testRunGetDetial(record);
        checkLogTabHidden = data.authorId != currentUserId;// 如果点击的节点不是自己的或者是新建的就要把查看审核记录的Tab给隐藏掉
        data.leaf = record.data.leaf;
        testRunPaddingFormForUpdate(data);
        testRunBanEditor(!testRunTabPanel.canUpdate);// 如果作者不是自己或者对象处于审核中的状态就要禁止操作
    }
    testRunHiddenTab(!record.data.leaf, checkLogTabHidden);// 如果点击的是文件夹就只是显示详情页就好了
    testRunDetailForm.down('#testRunDetailFormPriority').setHidden(
        !record.data.leaf);// 如果是点击文件夹的话就将优先级下拉框隐藏掉
    testRunDetailForm.down('#testRunDetailFormPriority').setConfig(
        'allowBlank', !record.data.leaf);// 如果是点击文件夹的话就将优先级下拉框可以不填
    testRunDetailForm.down('#testRunDetailFormState').setHidden(
        !record.data.leaf);// 如果是点击文件夹的话就将状态显示隐藏掉
    testRunDetailForm.down('#testRunDetailFormTestDesign').setHidden(
        !record.data.leaf);// 如果是新建文件夹的话就对应测试计划显示框隐藏掉
    testRunDetailForm.down('#testRunDetailFormTestDesignSelectButton')
        .setHidden(!record.data.leaf);// 如果是新建文件夹的话就对应测试计划显示框的选择按钮隐藏掉
    testRunShowForm();
}

// 修改了菜单的标题之后同步到中间的表单
function testRunSynchronize(text) {
    testRunDetailForm.down('#testRunDetailFormTitle').setValue(text);
    testRunDetailForm.down('#testRunDetailFormState').setValue('未完成');
}

// 用于隐藏和显示tabPanel的tab
function testRunHiddenTab(flag, checkLogTabHidden) {
    testRunTabPanel.setActiveTab(0);
    if (flag) {
        testRunTabPanel.tabBar.items.items[1].hide();
        testRunTabPanel.tabBar.items.items[2].hide();
    } else {
        testRunTabPanel.tabBar.items.items[1].show();
        if (checkLogTabHidden)
            testRunTabPanel.tabBar.items.items[2].hide();
        else
            testRunTabPanel.tabBar.items.items[2].show();
    }
}

// 将测试执行Tab中所有可以编辑的操作都禁止掉或者解禁，防止除作者以外的其他人修改
function testRunBanEditor(flag) {
    testRunDetailForm.down('#testRunDetailFormTitle').setReadOnly(flag);
    testRunDetailForm.down('#testRunDetailFormPriority').setReadOnly(flag);
    testRunDetailForm.down('#testRunDetailFormDescription').setReadOnly(flag);
    testRunDetailForm.down('#testRunDetailFormTestDesignSelectButton')
        .setDisabled(flag);
    testRunLogGrid.down('#testRunAddLogButton').setDisabled(flag);
    testRunLogGrid.down('#testRunDeleteLogButton').setDisabled(flag);
}

// 获取这个节点的详细信息
function testRunGetDetial(record) {
    var result;
    Ext.Ajax.request({// 获取当前节点的信息
        url: zuulUrl + '/' + testServiceName + '/common/testRun/detail/'
            + record.data.id,
        async: false, // ASYNC 是否异步( TRUE 异步 , FALSE 同步)
        success: function (response, opts) {
            var obj = Ext.decode(response.responseText);
            obj.createDate = obj.createDate.replace('T', '  ');
            obj.updateDate = obj.updateDate.replace('T', '  ');
            result = obj;
        },
        failure: function (response, opts) {
            var obj = Ext.decode(response.responseText);
            if (obj.code == 401 || obj.code == 402 || obj.code == 403)
                Ext.Msg.alert("错误", obj.message);
            else
                Ext.Msg.alert("错误", "该功能暂时不可用！");
        }
    });
    return result;
}

// 将获取到的数据填充到中间的表单
function testRunPaddingFormForUpdate(data) {
    testRunTabPanel.down('#testRunCommitButton').setHidden(
        data.authorId != currentUserId || data.status == '审核中');// 根据作者是不是自己以及是否在审核中来决定按钮是否显示出来
    testRunTabPanel.down('#testRunSaveButton').setHidden(
        data.authorId != currentUserId || data.status == '审核中');// 根据作者是不是自己以及是否在审核中来决定按钮是否显示出来
    testRunTabPanel.canUpdate = data.authorId == currentUserId
        && data.status != '审核中';
    // ********************************基本信息填充begin****************************************//
    testRunDetailForm.down('#testRunDetailFormTitle').setValue(data.title);
    testRunDetailForm.down('#testRunDetailFormAuthor').setValue(data.author);
    testRunDetailForm.down('#testRunDetailFormDescription').setValue(
        data.describe);
    testRunDetailForm.down('#testRunDetailFormCreateDate').setValue(
        data.createDate);
    testRunDetailForm.down('#testRunDetailFormUpdateDate').setValue(
        data.updateDate);
    // ********************************基本信息填充end****************************************//
    if (data.leaf) {// 如果是文件夹的话就不用填充后面几个版块
        // ********************************基本信息填充begin****************************************//
        testRunDetailForm.down('#testRunDetailFormState').setValue(data.status);
        testRunDetailForm.down('#testRunDetailFormPriority').setValue(
            data.priority);
        testRunDetailForm.down('#testRunDetailFormTestDesign').testDesign = data.testDesign;
        testRunDetailForm.down('#testRunDetailFormTestDesign').setValue(
            data.testDesignName);
        // ********************************基本信息填充end****************************************//
        // ********************************测试步骤填充begin****************************************//
        testRunLogStepStore.removeAll();
        testRunlogStore.removeAll();
        var logDtos = data.testRunLogDto;// 获取测试执行记录的Dto
        var logArr = new Array();
        Ext.each(logDtos, function (logDto) {// 遍历执行记录Dto
            var log = logDto.testRunLog;// 获取执行记录本身的内容
            logArr.push(log);
            var steps = logDto.testRunLogStep;// 获取每个执行记录下的测试步骤
            for (var i = 0, len = steps.length; i < len; i++) {// 讲测试步骤添加进储存数组中
                outSideSteps.push(steps[i]);
            }
        });
        testRunlogStore.setData(logArr);// 不知为何使用add方式一个个加会堆栈溢出，只能使用setData()方式
        // ********************************测试步骤填充end****************************************//
    }
}

// 用于保存现有的测试执行
function testRunSave(saveOrCommit) {
    testRunTabPanel.down('#testRunCommitButton').setDisabled(true);
    testRunTabPanel.down('#testRunSaveButton').setDisabled(true);
    if (testRunDetailForm.isValid()) {// 判断各种信息填写完整没有
        var result = new Object();
        var basicMsg = new Object();
        var item = testRunLeftTree.getSelectionModel().getSelected();// 得到被选择的行的数组.
        result['userId'] = currentUserId;
        basicMsg['id'] = item.items[0].data.id;
        basicMsg['title'] = testRunDetailForm.down('#testRunDetailFormTitle')
            .getValue();
        basicMsg['author'] = currentUserId;
        basicMsg['describe'] = testRunDetailForm.down(
            '#testRunDetailFormDescription').getValue();
        basicMsg['leaf'] = item.items[0].data.leaf ? 1 : 0;
        basicMsg['parentId'] = item.items[0].data.parentId;
        basicMsg['project'] = testRunProject;
        basicMsg['status'] = item.items[0].data.leaf ? saveOrCommit : 3;
        result['testRun'] = basicMsg;
        if (item.items[0].data.leaf) {// 如果保存不是测试集文件夹,就继续保存执行记录和执行测试和优先级
            basicMsg['priority'] = testRunDetailForm.down(
                '#testRunDetailFormPriority').getValue();
            basicMsg['testDesign'] = testRunDetailForm
                .down('#testRunDetailFormTestDesign').testDesign;// 获取这个测试执行对应执行的测试计划Id
            var logDtos = new Array();// 用于储存测试执行记录的Dto
            Ext.each(testRunlogStore.getData().items, function (log) {// 遍历此测试执行的执行记录
                var logDto = new Object();// 用于储存这个执行记录的所有信息
                var logSteps = new Array();// 用于储存这个执行记录旗下的执行步骤
                logDto['isCreate'] = log.data.isCreate;// 标识这个测试执行是否是新添加的
                logDto['testRunLog'] = log.data;// 将测试执行记录本身的信息保存起来
                logDto['testRunLog'].createDate = null;//不然不能通过后端的检验
                for (var i = 0; i < outSideSteps.length; i++) {// 遍历储存测试执行步骤的数组
                    if (outSideSteps[i].testRunLog == log.data.id) {// 如果是这个执行记录下的步骤
                        var logStep = new Object();
                        logStep['id'] = outSideSteps[i].id;// 获取这个步骤的Id
                        logStep['isPass'] = outSideSteps[i].isPass;// 获取这个步骤的执行状态
                        logStep['reason'] = outSideSteps[i].reason;// 获取这个步骤的状态理由
                        logSteps.push(logStep);// 将此步骤添加进这个测试执行记录旗下的测试步骤中
                    }
                }
                logDto['testRunLogStep'] = logSteps;// 将执行步骤装进Dto
                logDtos.push(logDto);
            });
            result['testRunLogDto'] = logDtos;
        }
        Ext.Ajax.request({
            url: zuulUrl + '/' + testServiceName + '/common/testRun',
            method: item.items[0].data.isCreate == 1 ? 'post' : 'put',
            async: false, // ASYNC 是否异步( TRUE 异步 , FALSE 同步)
            defaultXdrContentType: 'application/json',
            jsonData: JSON.stringify(result),
            success: function (response, opts) {
                var obj = Ext.decode(response.responseText);
                // 成功了的话要把树菜单的节点文本值更改为表单里填写的文本值
                testRunStore.getNodeById(item.items[0].data.id).set('text', obj.title);//item.items[0].data改不了
                item.items[0].data.isCreate = 0;// 将该节点的isCreate置为0，说明这个节点不再是新建节点
                testRunDetailForm.down('#testRunDetailFormCreateDate').setValue(
                    obj.createDate.replace('T', '  '));//不知道为什么会后面多出来小数
                testRunDetailForm.down('#testRunDetailFormUpdateDate').setValue(
                    obj.updateDate.replace('T', '  '));
                if (item.items[0].data.leaf) {//如果是叶子节点的话
                    testRunDetailForm.down('#testRunDetailFormState').setValue(obj.status);
                    outSideSteps = [];// 要将储存测试步骤的数组清空
                    testRunLogStepStore.removeAll();
                    testRunlogStore.removeAll();
                    var logDtos = obj.testRunLogDto;// 获取测试执行记录的Dto
                    var logArr = new Array();
                    Ext.each(logDtos, function (logDto) {// 遍历执行记录Dto
                        var log = logDto.testRunLog;// 获取执行记录本身的内容
                        logArr.push(log);
                        var steps = logDto.testRunLogStep;// 获取每个执行记录下的测试步骤
                        for (var i = 0, len = steps.length; i < len; i++) {// 讲测试步骤添加进储存数组中
                            outSideSteps.push(steps[i]);
                        }
                    });
                    testRunlogStore.setData(logArr);// 不知为何使用add方式一个个加会堆栈溢出，只能使用setData()方式
                }
                if (saveOrCommit == 0)// 如果是保存操作就显示保存成功
                    Ext.Msg.alert("成功", "保存成功");
                else
                    Ext.Msg.alert("成功", "保存并提交成功");// 不然就显示保存并提交成功
            },
            failure: function (response, opts) {
                var obj = Ext.decode(response.responseText);
                if (obj.code == 401 || obj.code == 402 || obj.code == 403)
                    Ext.Msg.alert("错误", obj.message);
                else
                    Ext.Msg.alert("错误", "该功能暂时不可用！");
            }
        });
    } else
        Ext.Msg.alert('错误', '测试计划信息请填写完全！');
    testRunTabPanel.down('#testRunCommitButton').setDisabled(false);
    testRunTabPanel.down('#testRunSaveButton').setDisabled(false);

}

// 获取孩子节点
function testRunDesignGetChildren(record) {
    if (record.get('leaf') == false && record.get('isHas') == 0) {
        Ext.Ajax.request({
            url: zuulUrl + '/' + testServiceName
                + '/common/testDesign/childrenIsPass/' + record.get('id'),
            method: 'get',
            async: false, // ASYNC 是否异步( TRUE 异步 , FALSE 同步)
            success: function (response, opts) {
                var obj = Ext.decode(response.responseText);
                Ext.each(obj, function (node) {// 获得数据之后先将title的值赋值给text
                    node.text = node.title;
                    if (node.leaf == 0 && node.childrenCount == 0)// 如果这个节点的可显示节点数量等于0则将此文件夹设置为不可展开
                        node.expandable = false;
                });
                record.appendChild(obj);
                if (record.data.leaf == false && record.data.expanded == false)
                    record.set('expanded', true);
                record.set("isHas", 1);
            },
            failure: function (response, opts) {
                var obj = Ext.decode(response.responseText);
                if (obj.code == 401 || obj.code == 402 || obj.code == 403)
                    Ext.Msg.alert("错误", obj.message);
                else
                    Ext.Msg.alert("错误", "该功能暂时不可用！");
            }
        });
    }
}

// 将测试执行的innerGrid显示到对应的rowBody
function displayInnerGrid(record, InnerGridType) {
    var steps = new Array();
    for (var i = 0, len = outSideSteps.length; i < len; i++) {
        if (outSideSteps[i].testRunLog == record.data.id)
            steps.push(outSideSteps[i]);
    }
    var afterShotData = testDesignBorderShot(steps);
    var innerStore = Ext.create('Ext.data.Store', {// 创建内部Grid的store
        data: afterShotData
        // 数据直接用排完序的步骤数据
    });
    var renderTo = 'z' + record.data.id;
    if (InnerGridType == 'InnerGridForCheck')
        renderTo = renderTo + '1';
    Ext.create(InnerGridType, {// 创建内部嵌套的grid
        renderTo: renderTo,// 将他显示到设置好的grid-rowBody里面
        store: innerStore
    });
}

// 将测试执行的innerGrid销毁
function destroyInnerGrid(record, isCheck) {

    var id = 'z' + record.get('id');
    if (isCheck)
        id = id + '1';
    var parent = document.getElementById(id);
    var child = parent.firstChild;

    while (child) {
        child.parentNode.removeChild(child);
        child = child.nextSibling;
    }

}

// 将编辑器传过来的值赋值到grid
function testRunPutEditDataIntoGrid(e) {
    if (testRunListenFlag) {
        testRunListenRowData.set('reason', e.data);// 将编辑器传回来的内容复制到grid对应的行上
        for (var i = 0, len = outSideSteps.length; i < len; i++) {// 不去要将传回来的值也保存在储存测试步骤的数组中
            if (outSideSteps[i].id == testRunListenRowData.data.id) {
                outSideSteps[i].resson = testRunListenRowData.data.reason;
                break;
            }
        }
        Ext.Msg.alert('成功', '保存成功');
    }
}
